package xvalidate

import (
	"errors"
	"gitee.com/xiedongji/antgo/core"

	"github.com/gin-gonic/gin"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
)

/* ====================================================================== *
 * 功能:验证参数 和 报错信息 本地化翻译
 * ====================================================================== */
func ValidateParam(ctx *gin.Context, param interface{}) error {
	// 获取验证器
	validTool, err := getValidator(ctx)
	if err != nil {
		return err
	}

	// 获取翻译器
	transTool, err := getTranslation(ctx)
	if err != nil {
		return err
	}

	// 开始校验
	err = validTool.Struct(param)
	if err != nil {
		errs := err.(validator.ValidationErrors)
		errMsgArr := []string{}
		for _, e := range errs {
			errMsgArr = append(errMsgArr, e.Translate(transTool)) // 翻译报错信息
		}
		// 提示 多条验证信息
		//return errors.New(strings.Join(errMsgArr, ","))

		// 提示 第一条验证信息
		return errors.New(errMsgArr[0])
	}
	return nil
}

/* ====================================================================== *
 * 功能:获取校验器
 * 描述:参考文档 https://github.com/go-playground/validator
 * ====================================================================== */
func getValidator(ctx *gin.Context) (*validator.Validate, error) {
	// 获取 验证工具
	val, ok := ctx.Get(core.CTX_VALIDATOR_KEY)
	if !ok {
		return nil, errors.New("没有获取到验证器") // 在translation中间件中设置了
	}
	validateTool, ok := val.(*validator.Validate)
	if !ok {
		return nil, errors.New("验证器转型报错")
	}
	return validateTool, nil
}

/* ====================================================================== *
 * 功能:获取翻译器
 * ====================================================================== */
func getTranslation(ctx *gin.Context) (ut.Translator, error) {
	trans, ok := ctx.Get(core.CTX_TRANSLATOR_KEY)
	if !ok {
		return nil, errors.New("没有获取到翻译器")
	}
	translator, ok := trans.(ut.Translator)
	if !ok {
		return nil, errors.New("翻译器转型报错")
	}
	return translator, nil
}
